package parteLexica;

import java.util.List;


//Diego Sabino
//Roberto fez um diagrama massa, vamos implementando de acordo com o diagrama,
//de acordo com os problemas q vai surgindo a gente vai discutindo.

//temos que ver como vai ficar as operações com mais de um char,
//era bom se a gente desse um jeito de deixar todas as operações como um unico char,
//mas acho dificil

public class TabelaDeTokens {

	public TabelaDeTokens (){
	}
	public static enum Token {
		IDENTIFICADOR,
		VALOR_INT,
		VALOR_FLOAT,
		VALOR_BOOL,
		VALOR_CHAR,
		VALOR_STRING,
		SOMA_INT,
		SOMA_FLOAT,
		SUBTRACAO_INT,
		SUBTRACAO_FLOAT,
		MULTIPLICACAO_INT,
		MULTIPLICACAO_FLOAT,
		DIVISAO_INT,
		DIVISAO_FLOAT,
		MENOS_UNARIO_FLOAT,
		MENOS_UNARIO_INT,
		ABRE_PARENTESIS,
		FECHA_PARENTESIS,
		ABRE_COLCHETE,
		FECHA_COLCHETE,
		ABRE_CHAVE,
		FECHA_CHAVE,
		VIRGULA,
		PONTO_E_VIRGULA,
		PONTO_E_VIRGULA_DUPLO,
		PONTO,
		DOIS_PONTOS,
		LET,
		IN,
		REC,
		ATRIBUICAO,
		MAIOR,
		MAIOR_OU_IGUAL,
		MENOR,
		MENOR_OU_IGUAL,
		COMPARACAO,
		DIFERENTE,
		AND,
		OR,
		NOT,
		CONCATENACAO,	
		TOKEN_INVALIDO,
		TIPO_ARRAY,
		TIPO_INT,
		TIPO_FLOAT,
		TIPO_CHAR,
		TIPO_STRING,
		TIPO_BOOL,
		SETA,
		BEGIN,
		END, 
		WHILE, 
		IF, 
		FOR,
		TO,
		DO,
		DONE,
		THEN, 
		ELSE,
		FUN, 
		TYPE,
		REF, DOIS_PONTOS_IGUAL, EXCLAMACAO, BARRA_VERTICAL,MATCH,WITH, ARRAY;
		
	}
	
	private Token[] Operadores = {
		Token.SOMA_INT,
		Token.SOMA_FLOAT,
		Token.SUBTRACAO_INT,
		Token.SUBTRACAO_FLOAT,
		Token.MULTIPLICACAO_INT,
		Token.MULTIPLICACAO_FLOAT,
		Token.DIVISAO_INT,
		Token.DIVISAO_FLOAT,
		Token.MENOS_UNARIO_FLOAT,
		Token.MENOS_UNARIO_INT,
		Token.MAIOR,
		Token.MAIOR_OU_IGUAL,
		Token.MENOR,
		Token.MENOR_OU_IGUAL,
		Token.COMPARACAO,
		Token.DIFERENTE,
		Token.AND,
		Token.OR,
		Token.NOT,
		Token.CONCATENACAO};
	
	private Token[] OperadoresChar = {
			Token.MAIOR,
			Token.MAIOR_OU_IGUAL,
			Token.MENOR,
			Token.MENOR_OU_IGUAL,
			Token.COMPARACAO,
			Token.DIFERENTE
	};
	
	private Token[] OperadoresString = {
			Token.CONCATENACAO,
			Token.COMPARACAO,
			Token.DIFERENTE,
	};
	
	private Token[] OperadoresFloat = {
			Token.SOMA_FLOAT,
			Token.SUBTRACAO_FLOAT,
			Token.MULTIPLICACAO_FLOAT,
			Token.DIVISAO_FLOAT,
			Token.MENOS_UNARIO_FLOAT,
			Token.MAIOR,
			Token.MAIOR_OU_IGUAL,
			Token.MENOR,
			Token.MENOR_OU_IGUAL,
			Token.COMPARACAO,
			Token.DIFERENTE
	};
	
	private Token[] OperadoresInt = {
			Token.SOMA_INT,
			Token.SUBTRACAO_INT,
			Token.MULTIPLICACAO_INT,
			Token.DIVISAO_INT,
			Token.MENOS_UNARIO_INT,
			Token.MAIOR,
			Token.MAIOR_OU_IGUAL,
			Token.MENOR,
			Token.MENOR_OU_IGUAL,
			Token.COMPARACAO,
			Token.DIFERENTE
	};
	
	private Token[] OperadoresBool = {
			Token.MAIOR,
			Token.MAIOR_OU_IGUAL,
			Token.MENOR,
			Token.MENOR_OU_IGUAL,
			Token.COMPARACAO,
			Token.DIFERENTE,
			Token.AND,
			Token.OR,
			Token.NOT
	};
	
	private Token[] Operandos = {
			Token.VALOR_INT,
			Token.VALOR_FLOAT,
			Token.VALOR_BOOL,
			Token.VALOR_CHAR,
			Token.VALOR_STRING
	};
	
	private static Token[] Tipo = {
			Token.TIPO_ARRAY,
			Token.TIPO_INT,
			Token.TIPO_FLOAT,
			Token.TIPO_CHAR,
			Token.TIPO_STRING,
			Token.TIPO_BOOL,
	};
	
	public boolean ehOperador (Token token) {
		boolean resultado = false;
		for (int i = 0; i < Operadores.length;i++) {
			if (token == Operadores[i]) {
				resultado = true;
				i = Operadores.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperando (Token token) {
		boolean resultado = false;
		for (int i = 0; i < Operandos.length;i++) {
			if (token == Operandos[i]) {
				resultado = true;
				i = Operandos.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperadorBool (Token token) {
		boolean resultado = false;
		for (int i = 0; i < OperadoresBool.length;i++) {
			if (token == OperadoresBool[i]) {
				resultado = true;
				i = OperadoresBool.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperadorInt (Token token) {
		boolean resultado = false;
		for (int i = 0; i < OperadoresInt.length;i++) {
			if (token == OperadoresInt[i]) {
				resultado = true;
				i = OperadoresInt.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperadorFloat (Token token) {
		boolean resultado = false;
		for (int i = 0; i < OperadoresFloat.length;i++) {
			if (token == OperadoresFloat[i]) {
				resultado = true;
				i = OperadoresFloat.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperadorChar (Token token) {
		boolean resultado = false;
		for (int i = 0; i < OperadoresChar.length;i++) {
			if (token == OperadoresChar[i]) {
				resultado = true;
				i = OperadoresChar.length;
			}
		}
		return resultado;
	}
	
	public boolean ehOperadorString (Token token) {
		boolean resultado = false;
		for (int i = 0; i < OperadoresString.length;i++) {
			if (token == OperadoresString[i]) {
				resultado = true;
				i = OperadoresString.length;
			}
		}
		return resultado;
	}
	
	public static boolean ehTipo (Token token) {
		boolean resultado = false;
		for (int i = 0; i < Tipo.length;i++) {
			if (token == Tipo[i]) {
				resultado = true;
				i = Tipo.length;
			}
		}
		return resultado;
	}
}
